package stream.method;

import stream.StreamsLearn;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;

/**
 * @CreateBy zhangdingyi
 * @Date 2022-10-13
 * @Content 简约操作
 */
public class Eight {
    public static void main(String[] args) {
        testReduce();
    }

    static List<Integer> getIntList() {
        List<Integer> list = new ArrayList<>();
        for (int i = 60; i < 60; i++) list.add(i);
        return list;
    }

    // 1 ~ 100 累加计算方法
    //5050 - 4500 = 550
    //1~10 = 45 , 10 ~ 20 = 145, 20 ~ 30 = 245, 30~40 = 345, 40~50=445
    // 50~60 = 545，60~70=645, 70~80 = 745, 80~90 = 845, 90 ~ 100 = 945
    //十位 45 * 10 = 450 ,百位 100 ~ 900 = 4500 + 100

    // reduce 可以用作于 求和、乘积、字符串连接、取最大值和最小值、求集的并与交等，但不能用于 减法
    //因为 仅能使得 等式 成立 才适合 reduce -> (x op y) op z = x op (y op z), op 表示 某种运算
    //因为 reduce 方法在实际中会使用并行操作 -因此必须使得等式成立
    static void testReduce() {
        Optional<Integer> reduce = getIntList().stream().reduce((x, y) -> x + y);
        System.out.println("reduce: " + reduce);
        Optional<Integer> reduceInt = getIntList().stream().reduce(Integer::sum);
        System.out.println("reduceInt: " + reduceInt);

        //可以设置 一个 0 幺元值，这个值就相当于 默认值 0
        Integer reduceInt2 = getIntList().stream().reduce(0, Integer::sum);
        System.out.println("reduceInt: " + reduceInt);

        //计算 对象
        Integer integer = StreamsLearn.getListStr().stream().reduce(0, (t, s) -> s.length() + t, (t1, t2) -> t1 + t2);
        System.out.println("integer: " + integer);
        //如果需要运算对象
        Integer integer1 = StreamsLearn.getListObj().stream().reduce(0, (t, s) -> s.getId() + t, (t1, t2) -> t1 + t2);
        System.out.println("integer1: " + integer1);
    }
}
